\chapter{Logs de falhas}

Em muitos sistemas de software, os dados são coletados continuamente durante a execução do programa, sendo armazenados em arquivos de log e analisados no caso de falhas do sistema e mal funcionamento com a finalidade de identificar as causas e localizações dos problemas~\cite{mariani08}.

Quando ocorre um problema, os arquivos de logs são os primeiros a serem analisados. Acontece que, como os desenvolvedores e administradores de sistemas não possuem total conhecimento dos alvos dos logs, um esforço considerável é despendido com o objetivo de isolar o problema.

\section{Técnicas}

Técnicas automáticas tem sido propostas para a análise de arquivo de log. Estas técnicas podem ser agrupadas em três classes principais~\cite{mariani08}:
	
	\begin{itemize}
		\item técnicas baseadas em especificação;
		\item sistemas especialistas;
		\item técnicas baseadas em heurística.
	\end{itemize}

\subsection{Técnicas Baseadas em Especificação}

{\bf Técnica baseada em especificação} é uma técnica que combina a força da detecção do mau uso e da anomalia. Uma especificação desenvolvida manualmente é usada para caracterizar legitimamente comportamentos do programa. Como é um método baseado em legitimar comportamentos, ele não gera alarmes falsos quando comportamentos de programa não usuais (mas legítimos) são encontrados. Assim, é uma taxa de falso positivo que pode ser comparada com aquela detecção de mal uso. Uma vez que detecta ataques como desvios comportamentos legítimos, tem o potencial para detectar ataques anteriormente desconhecidos~\cite{Uppuluri01}. Ou seja, é uma técnica que compara eventos em arquivos de log com especificações formais que descrevem sequências legais de eventos. As anomalias reconhecidas, i.e, sequência de eventos não aceita pelas especificações, são apresentadas aos testadores~\cite{mariani08}.

Estas técnicas tem a importante vantagem de apresentar apenas e todos os problemas que podem ser detectados de logs. Infelizmente, especificações completas e consistentes são caras para serem produzidas e mantidas. Assim, as especificações adequadas são raramente disponibilizadas e raramente é possível a aplicação de tais abordagens~\cite{mariani08}.

\subsection{Sistemas Especialistas}

{\bf Sistemas especialistas} são programas de computador inteligente que utilizam procedimentos de conhecimento e inferência para resolver problemas que são difíceis o suficiente para exigir experiência humana significativa para as suas soluções~\cite{giarratono98}. Eles não exigem especificações completas para identificar sequências suspeitas, mas exigem catálogos definidos pelos usuários que descrevem os eventos que são comumente relacionados a falhas. Enquanto o formato comum de log usado inclui dados não estruturados, sistemas especialistas para análise de arquivo de log necessitam de ser adaptados com o usuário-definidos expressões regulares para analisar e reconhecer os tipos de eventos interessantes. Geralmente o grande número de possibilidades de tipos de eventos faz da definição e manutenção dessas expressões regulares uma tarefa cara e sujeita a erros~\cite{mariani08}.

A Figura \ref{fig:expert_system_structure} mostra os módulos que fazem parte de um típico sistema especialista. O usuário interage com o sistema através da {\it interface do usuário} (user interface) que simplifica a comunicação e esconde muito da complexidade, como a estrutura interna das regras de base. A decisão final sobre o tipo de interface é um compromisso entre as necessidades do usuário e os requisitos da {\it base de conhecimento} e {\it sistema de inferência}~\cite{luger98}. 

O coração do sistema especialista é a {\it base de conhecimento}, que contem o conhecimento de um particular domínio de aplicação. Em uma base de regras de um sistema especialista, esse conhecimento é normalmente representado na forma de {\it if... then... regras}. A base de conhecimento contem tanto {\it conhecimentos gerais} como também {\it informações de casos específicos}~\cite{luger98}.

O {\it motor de inferência} aplica o conhecimento para a solução dos problemas atuais. É essencialmente um interpretador para o conhecimento de base. No sistema de produção, o motor de inferência efetua o ciclo de controle reconhecer-agir. O procedimento que implementa o ciclo de controle é separado das regras de produção~\cite{luger98}.

O sistema especialista deve acompanhar os {\it dados específicos de caso}: fatos, conclusões, e outras informações relevantes para o caso sob consideração. O {\it o subsistema de explicação} permite ao programa explicar suas resoluções ao usuário. Essas explicações incluem justificativas para as conclusões so sistema, em resposta para {\it como as consultas}, {\it por que das consultas} e {\it onde serão úteis}~\cite{luger98}.

{\it Editor de conhecimentos base} ajudam o programador a localizar e corrigir bugs no desempenho do programa, muitas vezes acessando a informação provida pelo subsistema de explicação~\cite{luger98}.

\begin{figure}[H]
 \begin{center}
  \includegraphics[width=1.0\textwidth]{imagens/expert_system_structure}
  \caption{Arquitetura Básica de um Sistema Especialista~\cite{luger98}.}
  \label{fig:expert_system_structure}
 \end{center}
\end{figure}

\subsection{Técnicas baseadas em heurísticas}

{\bf Técnicas baseadas em heurísticas} é a classe das técnicas que fornecem a solução mais geral e exige pequeno esforço para ser aplicada. Esta técnica detecta sequências de eventos legal e ilegal utilizando algoritmos de aprendizagem de máquina supervisionadas e não supervisionadas. Técnicas de aprendizado supervisionadas analisam arquivo de log correspondentes a falha e sucesso de execuções para extrair conhecimento suficiente para detectar automaticamente questões em execuções futuras. Na fase de aprendizado, a intervenção do usuário é exigida para diferenciar execuções legais e ilegais~\cite{mariani08}.

Técnicas de aprendizado não supervisionadas automatizam completamente o processo de análise e detecta automaticamente clusters dos eventos relacionados dos arquivos de log. Eventos suspeitos são identificados pela seleção de eventos que não pertencem à nenhum cluster (conhecidos como discrepantes)~\cite{mariani08}.

Alta automação é a maior vantagem das técnicas baseadas em heurística, mas sua eficácia é limitada pela expressividade dos modelos aprendidos. Técnicas existentes capturam falhas adequadamente devido a simples eventos inesperados, mas não endereçam problemas relacionados a sequências específicas, e.g., um conjunto de eventos que são individualmente aceitáveis mas que levam a um problema se eles ocorrem em uma ordem inesperada, ou fluxo de dados específico, e.g., atributos de dados que são individualmente aceitáveis mas que levam a um problema se eles aparecem em uma ordem inesperada~\cite{mariani08}.

Podemos analisar um problema de heurística de outro ponto de vista~\cite{tversky83}: "A avaliação subjetiva de probabilidade se assemelha a avaliação subjetiva de quantidades físicas, como a distância ou tamanho. Estes julgamentos são baseados em dados de validade limitado, que são processados de acordo com regras heurísticas. Por exemplo, a distância aparente de um objeto é determinada em parte pela sua clareza. Quanto mais nítido é o objeto, mais próximo ele aparenta estar. Esta regra tem alguma validade, porque em qualquer determinada cena os objetos mais distantes são vistos menos nitidamente do que objetos mais próximos. No entanto, a confiança nesta regra leva a erros sistemáticos na estimativa da distância. Especificamente, as distâncias são muitas vezes superestimadas quando a visibilidade é ruim porque os contornos dos objetos estão tremidas. Por outro lado, as distâncias são frequentemente subestimadas quando a visibilidade é boa, porque os objetos são vistos nitidamente. Assim, a dependência 
de clareza como uma indicação leva a preconceitos comuns. Esses preconceitos são encontrados também em julgamentos intuitivos de probabilidade".
